/**
 * @file at24c02.c
 * @author your name (you@domain.com)
 * @brief
 * @version 0.1
 * @date 2022-05-23
 *
 * @copyright Copyright (c) 2022
 *
 */
#include <at24c02.h>

/**
 * @brief 设置即将操作的地址
 * @param address 指定要写入的地址
 * @return int 返回程序执行的状态
 */
int at24c02_set_current_address(uint8_t address)
{
    return HAL_I2C_Master_Transmit(&hi2c1, MAZMOD_AT24CXX_8BIT_WADDR, &address, 1, MAZMOD_AT24CXX_TIMEOUT);
}

/**
 * @brief 在指定的地址写一个字节
 * @param address 指定要写入的地址
 * @param buffer 要写入数据的数据缓存区
 * @return int 返回程序执行的状态
 */
int at24c02_byte_write(uint8_t address, uint8_t* buffer)
{
    int ret = 0;
    ret = HAL_I2C_Mem_Write(&hi2c1, MAZMOD_AT24CXX_8BIT_WADDR, address, I2C_MEMADD_SIZE_8BIT, buffer, 1, MAZMOD_AT24CXX_TIMEOUT);
    HAL_Delay(5);       // 对用手册中 Twr
    return ret;
}

/**
 * @brief 在指定的地址连续写入字节
 * @param address 指定要写入的首地址
 * @param buffer 要写入数据的数据缓存区
 * @param length 指定要写入的字节个数, 单次最多写入8字节数据
 * @return int 返回程序执行的状态
 * @note 此函数为页写入函数, 对于at24c02一页为8个字节
 */
int at24c02_page_write(uint8_t address, uint8_t* buffer, uint8_t length)
{
    int ret = 0;

    if((length <= 0) || (length > 8))
    {
        printf("err: [at24c02][%s]: length parameter values are not specification line = %d \r\n", __FUNCTION__, __LINE__);
        return HAL_ERROR;
    }

    ret = HAL_I2C_Mem_Write(&hi2c1, MAZMOD_AT24CXX_8BIT_WADDR, address, I2C_MEMADD_SIZE_8BIT, buffer, length, MAZMOD_AT24CXX_TIMEOUT);
    HAL_Delay(5);       // 对用手册中 Twr
    return ret;
}

/**
 * @brief 直接读取当前地址的内容
 * @param buffer 保存读取到的数据的缓存区
 * @return int 返回程序执行的状态
 */
int at24c02_current_address_read(uint8_t* buffer)
{
    return HAL_I2C_Master_Receive(&hi2c1, MAZMOD_AT24CXX_8BIT_RADDR, buffer, 1, MAZMOD_AT24CXX_TIMEOUT);
}

/**
 * @brief 在指定的地址读取一个字节
 * @param address 指定要读取的首地址
 * @param buffer 保存读取到的数据的缓存区
 * @return int 返回程序执行的状态
 */
int at24c02_random_read(uint8_t address, uint8_t* buffer)
{
    return HAL_I2C_Mem_Read(&hi2c1, MAZMOD_AT24CXX_8BIT_RADDR, address, I2C_MEMADD_SIZE_8BIT, buffer, 1, 1000);
}

/**
 * @brief 从当前地址读取一片连续的字节
 * @param address 指定要读取的首地址
 * @param buffer 保存读取到的数据的缓存区
 * @return uint8_t 返回程序执行的状态
 */
int at24c02_sequential_read(uint8_t* buffer, uint16_t length)
{
    return HAL_I2C_Master_Receive(&hi2c1, MAZMOD_AT24CXX_8BIT_RADDR, buffer, length, 1000);
}

/**
 * @brief 在指定的地址读取一片连续的字节
 * @param address 指定要读取的首地址
 * @param buffer 保存读取到的数据的缓存区
 * @return uint8_t 返回程序执行的状态
 */
int at24c02_continuous_read(uint8_t address, uint8_t* buffer, uint16_t length)
{
    return HAL_I2C_Mem_Read(&hi2c1, MAZMOD_AT24CXX_8BIT_RADDR, address, I2C_MEMADD_SIZE_8BIT, buffer, length, 1000);
}
